package com.pactera.mavenweb.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import com.pactera.mavenweb.controller.UserController;

public class LogAdvice {
	
	protected static Logger logger = Logger.getLogger(LogAdvice.class);
	
	/** 
	 * 执行方法前拦截器 
	 *  
	 * @param joinPoint 
	 */
	public void methodBefore(JoinPoint jp) {
		logger.debug("log Begining method: "
				+ jp.getTarget().getClass().getName() + "."
				+ jp.getSignature().getName());
	}
	
	/**
	 * 方法执行后拦截器 
	 * 
	 * @param joinPoint
	 */
	public void methodAfter(JoinPoint jp) {
		logger.debug("log Ending method: "
				+ jp.getTarget().getClass().getName() + "."
				+ jp.getSignature().getName());
	}
	
	/** 
	 * 方法出现异常拦截器
	 *  
	 * @param joinPoint
	 */  
	public void methodException(JoinPoint jp, Throwable ex) {
		logger.debug("method " + jp.getTarget().getClass().getName()
					+ "." + jp.getSignature().getName() + " throw exception");
		logger.debug(ex.getMessage());
	}
	
	/** 
	 * 方法环绕拦截器，如果使用了这个，可以忽视上面的方法 
	 * 注意该方法参数为ProceedingJoinPoint ，这是可以执行的，只有round可以使用 
	 * @param joinPoint 
	 * @return 
	 */
	public Object methodRound(ProceedingJoinPoint joinPoint)  throws Throwable {
		long time = System.currentTimeMillis();
		Object retVal = joinPoint.proceed();
		time = System.currentTimeMillis() - time;
		logger.debug("process time: " + time + " ms");
		return retVal;
	}
}
